.model small,stdcall;小内存模式 标准调用
;常量声明
NULL EQU 0;定义空常量
READ_ONLY_FILE EQU 0000000000000001b;定义常数 只读文件
HIDE_FILE EQU 0000000000000010b;定义常数 隐藏文件
SYSTEM_FILE EQU 0000000000000100b;定义常数 系统文件
ARCHIVE_FILE EQU 0000000000100000b;定义常数 归档文件
;函数原型声明
_printf PROTO :WORD
printf EQU invoke _printf,
;堆栈段声明
.stack 200h
;数据段声明
.data
;变量以及字串声明
    filename BYTE '.\tempfile.txt',NULL;待操作的文件名字串，以空字节结尾
	filetop EQU $ - filename;让编译器取filename字串长度
	hFile WORD ?;handle of open file
	fileBuf BYTE 100h dup (?);文件缓冲区
;错误、消息、提示字串
	msg1 BYTE "Path not find.",0dh,0ah,'$'
	msg2 BYTE "Open too much file.",0dh,0ah,'$'
	msg3 BYTE "File access denied",0dh,0ah,'$'
	msg4 BYTE "Unknow error",0dh,0ah,'$'
	msg5 BYTE "FCB invalid.",0dh,0ah,'$'
	msg6 BYTE "File out range.",0dh,0ah,'$'
	msg8 BYTE "String equal.",0dh,0ah,'$'
	msg9 BYTE "Different string.",0dh,0ah,'$'
;代码段声明
.CODE
START:
.startup;初始化数据段(DS)、堆栈段(SS)段基址及堆栈指针(SP)
open_file:;尝试打开文件
	mov ax,03d02h;DOS功能 3D 尝试打开一个文件
	lea dx,filename;将文件名字串地址装入dx
	int 21h;调用DOS中断
	jc access_file_failed;访问文件失败，跳转失败处理。
open_file_succeed:;文件开启成功
	mov hFile,ax;将中断返回的文件句柄放入文件句柄变量中保存
read_file:;尝试读文件
	mov bx,hFile;读文件句柄
	mov cx,0100h;置缓冲区长度
	lea dx,fileBuf;装载缓冲区地址
	mov ah,03fh;尝试读一个文件
	int 21h;调用DOS中断
	jc access_file_failed;访问文件失败，跳转失败处理。
read_file_succeed:;成功打开文件
		.if ax == 0;文件长度=0 则填充文件内容并保存
		mov al,' ';填充256个空格
		push ds
		pop es;将附加段段基址初始化
		lea di,fileBuf;指向文件缓冲区
		mov cx,100h;填充计数器赋值256
		cld;步进趋势-自增
		rep stosb;填充缓冲区
		lea si,filename
		lea di,fileBuf
		add di,10
		mov cx,filetop - 1
		cld
		rep movsb;拷贝文件名字串至文件缓冲区偏移+10
		mov bx,hFile
		mov cx,0100h
		lea dx,fileBuf
		mov ah,40h
		int 21h;调用DOS中断,写入文件
		jc access_file_failed;访问文件失败，跳转失败处理。
	.else;文件长度不为0，判断文件内字串是否等于文件名
		push ds
		pop es
		lea si,filename
		lea di,fileBuf
		add di,10
		mov cx,filetop - 1
		cld
		rep cmpsb
		jne different
		printf ADDR msg8
		jmp close_file
		different:
		printf ADDR msg9
	.endif
close_file:;关闭文件
	mov bx,hFile
	mov ah,3eh
	int 21h;调用DOS中断
	jc close_file_faield;关闭文件失败，跳转失败处理。
close_file_succeed:
;程序结束返回DOS
_exit:
	xor al,al
.exit
access_file_failed:;打开文件异常处理
	.if ax == 02h;文件未找到
		mov cx,NULL;ARCHIVE_FILE and 0fh;尝试建立这个文件
		lea dx,filename
		mov ah,3ch
		int 21h;调用DOS中断
		jc access_file_failed
		jmp open_file_succeed
	.elseif ax == 03h;路径为不正确
		printf ADDR msg1
	.elseif ax == 04h;打开太多文件
		printf ADDR msg2
	.elseif ax == 05h;访问被拒绝
		printf ADDR msg3
	.elseif ax == 06h
		printf ADDR msg5
	.elseif ax == 0ch;输入参数不正确
		jmp @f
	.else
		@@:
		printf ADDR msg4
	.endif
	jmp _exit
close_file_faield:
	printf ADDR msg4
	jmp _exit
;函数区
;打印字串
_printf proc near uses bx cx dx,pString
	mov ah,09h
	mov dx,pString
	int 21h;调用DOS中断
	xor ax,ax
	ret
_printf endp
END START